#include "LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>
using namespace std;

////////////////////////////////////////////////////////////////////////////////
LecteurSymbole::LecteurSymbole(string nomFich) :
	lc(nomFich), symCour("") {
	suivant(); // pour lire le premier symbole
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::suivant() {
	sauterSeparateurs();
	// on est maintenant positionne sur le premier caractère d'un symbole
	ligne=lc.getLigne();
	colonne=lc.getColonne();
	symCour=Symbole(motSuivant()); // on reconstruit symCour avec le nouveau mot lu
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterSeparateurs() {
	while (lc.getCarCour()==' '  ||                                //  tant que caractère courant = espace OU
                lc.getCarCour()=='\t'||                                //  \t OU
		lc.getCarCour()=='\r'||                                //  \r OU
                lc.getCarCour()=='#' ||                                //  symbole de commentaire OU
		lc.getCarCour()=='\n')                                 //  \n
        {
                if (lc.getCarCour()=='#')                               // si c'est un #
               sauterCommentaire();                                     // appel de la fonction sauterCommentaire
                lc.suivant();                                           // on passe qu suivant
        }
}        

////////////////////////////////////////////////////////////////////////////////
string LecteurSymbole::motSuivant() {
	static string  s;
	s="";
	if (isdigit(lc.getCarCour()))                                           // c'est le début d'un entier
		do {
			s=s+lc.getCarCour();
			lc.suivant();
		} while (isdigit(lc.getCarCour()));
                
//------------------------------------------------------------------------------               
	else if (isalpha(lc.getCarCour()))                                      // c'est le début d'un mot
                do {
			s=s+lc.getCarCour();            
			lc.suivant();
		} while (isalpha(lc.getCarCour())  || 
				 isdigit(lc.getCarCour()) || 
				 lc.getCarCour()=='_');
//------------------------------------------------------------------------------
        else if (lc.getCarCour()=='=' || lc.getCarCour()=='!' || lc.getCarCour()=='<' || lc.getCarCour()=='>'){
                //do {
			s=s+lc.getCarCour();            
                        lc.suivant();
                        if (lc.getCarCour()=='=')
                        { s=s+lc.getCarCour();
                        lc.suivant();} 
                // } while (lc.getCarCour()!='=');
 
        }
//------------------------------------------------------------------------------                
        else if(lc.getCarCour()=='"'){                                          //si ca commence par guillemet    
            do {
                        s=s+lc.getCarCour();
			lc.suivant();                
                  } while (lc.getCarCour()!='"');                               // tq le caractère rencontré n'est pas ' " ' on stocker les caractères lu et on lit le prochain;    
            
            s=s+lc.getCarCour();
            lc.suivant();                                                       //pb: cas où pas de second guillemet->bug (lever exception)
        }                                     
//------------------------------------------------------------------------------    
        
	else if (lc.getCarCour()!=EOF)                                          // c'est un caractere special
	{
		s=lc.getCarCour();
		lc.suivant();
	}
        
	return s;
       
}

////////////////////////////////////////////////////////////////////////////////
void LecteurSymbole::sauterCommentaire() {
	 
            while (lc.getCarCour()!='\r' &&
                   lc.getCarCour()!='\n') {
                lc.suivant();
             } 
}